package com.openx.boot.core.utils;

import com.lowagie.text.pdf.BaseFont;
import lombok.extern.slf4j.Slf4j;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.*;
import java.util.Map;

/**
 * 模板工具类
 *
 * @author yadu
 */
@Slf4j
public class PDFUtil {


    private TemplateEngine templateEngine;
    /**
     * 字体文件地址
     */
    private final String FONT_FILE_ADDRESS = "font/simsun.ttf";


    public PDFUtil(TemplateEngine templateEngine) {
        this.templateEngine = templateEngine;
    }


    /**
     * 生成文件
     * 模板在/src/main/resources/templates 目录下的文件名称
     *
     * @param htmlTemplate   模板文件名称 contract  模板默认所在目录在/src/main/resources/templates
     * @param targetFilePath 生成文件路径 D:/contract.html
     * @param data           模板数据
     */
    public void generateFile(String htmlTemplate, String targetFilePath, Map<String, Object> data) {
        try {
            File file = new File(targetFilePath);
            File dir = new File(file.getParent());
            if (!dir.exists() && !dir.isDirectory()) {
                dir.mkdirs();
            }
            Writer writer = new FileWriter(file);
            Context context = new Context();
            context.setVariables(data);
            this.templateEngine.process(htmlTemplate, context, writer);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 生成html内容
     *
     * @param htmlTemplate 模板文件名称 contract  模板默认所在目录在/src/main/resources/templates
     * @param data         模板数据
     * @return 模板内容 String 类型
     */
    public String generateHtml(String htmlTemplate, Map data) {
        try {
            Context context = new Context();
            context.setVariables(data);
            return this.templateEngine.process(htmlTemplate, context);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }

    /**
     * 生成文件
     * 模板在/src/main/resources/templates 目录下的文件名称
     *
     * @param htmlTemplate   模板文件名称 contract  模板默认所在目录在/src/main/resources/templates
     * @param targetFilePath 生成文件路径 D:/contract.html
     * @param data           模板数据
     */
    public File generatePdf(String htmlTemplate, String targetFilePath, Map<String, Object> data) {
        try {
            String html = generateHtml(htmlTemplate, data);
            return generatePdf(html, targetFilePath);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    public File generatePdf(String content, String targetFilePath) throws Exception {
        File file = new File(targetFilePath);
        File dir = new File(file.getParent());
        if (!dir.exists() && !dir.isDirectory()) {
            dir.mkdirs();
        }
        ITextRenderer renderer = new ITextRenderer();
        ITextFontResolver fontResolver = renderer.getFontResolver();
        try {

            //设置字体，否则不支持中文,在html中使用字体，html{ font-family: SimSun;}
            fontResolver.addFont(this.FONT_FILE_ADDRESS, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            renderer.setDocumentFromString(content);
            renderer.layout();
            renderer.createPDF(new FileOutputStream(file));
            renderer.finishPDF();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }

}
